package com.zwh.se.design_pattern.creational.singleton;


/**
 * 懒汉式：<p>
 * 优点：避免了类加载时就直接初始化，实现了按需初始化（这种机制被称为"懒加载"）<p>
 * 缺点：1、没有加锁 synchronized，所以在多线程环境下，不能正常工作（可能会导致出现创建出多个实例的情况）<p>
 * 因此严格意义上，这样写的情况下，它并不算单例模式。
 * <p>
 *
 * @author yexi
 */
public class Lazy {

    //保持该类在系统中有且只有一个实例
    private static Lazy INSTANCE;

    //私有化构造方法
    private Lazy() {
    }

    //对外界提供统一调用方法获取单例对象
    public static Lazy getInstance() {
        //懒汉式缺点的原因：没有锁，多线程下会出问题
        if (INSTANCE == null) {
            try {
                //模拟在创建对象的过程中稍微出了点问题或者说业务需要,导致慢了一点点。也可以省略这段，只是为了让效果更加明显。
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //只在调用了方法时才进行初始化(方法调用时才实例化，所以解决了饿汉式的缺点）
            INSTANCE = new Lazy();
        }
        return INSTANCE;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(() ->
                    System.out.println(Lazy.getInstance().hashCode())
            ).start();
        }
    }

}
